package NIO_AIO_Netty;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @program: planet-company
 * @description:
 * @author: jyz
 * @create: 2019-09-19 19:03
 **/
public class BIOServerTest {

    public static void main(String[] args) throws IOException {
        //定义一个Server插座，有好多插头，等着插头来插，建立连接
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.bind(new InetSocketAddress("localhost",8888));
        while (true){
            //accept()它是阻塞的，阻塞方法，下面的代码不会被运行，什么时候才会放开，当有链接进来时
            Socket s1 = serverSocket.accept();
            //当有插头插上时，才会走这里，不然会一直阻塞在前面accept哪里
            //当有插头连过来时，开一个通道--起一个线程去处理业务，，也就是说有多少个客户端进来就会开多少个线程
            //BIO为什么要开一个线程去处理业务----为了解放accept()当前线程
            new Thread(()->{
                handle(s1);
            });
        }
    }


    static void handle(Socket socket){
        try {
            byte[] bytes = new byte[1024];
            //这里也是BIO比较好玩的地方，就是他的通道是单向的，就是输入是一个通道，下面输出又是输出通道
            int len = socket.getInputStream().read(bytes);
            System.out.println(new String(bytes,0,len));
            socket.getOutputStream().write(bytes,0,len);
            socket.getOutputStream().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 总结BIO阻塞在哪里
     * 1、serverSocket.accept(); 阻塞的，一直没有客户端进来，也会一直阻塞
     * 2、socket.getInputStream().read(bytes)  阻塞的，也就是说你read不进来，就会一直阻塞
     * 3、socket.getOutputStream().write(bytes,0,len)  阻塞的，你写出去，客户端不接收，也会阻塞
     *
     */
}
